#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <functional>
#include <vector> 

using namespace std;

using func_t = function<void()>;

int threadnum = 5;

class ThreadReturn
{
public:
    ThreadReturn(const pthread_t &id, string const &info, const int &code)
        :id_(id)
        ,info_(info)
        ,code_(code)
    {}
public:
    pthread_t id_;
    string info_;
    int code_;
};


// void *ThreadRoutine(void *args)
// {
//     ThreadData *td = static_cast<ThreadData*>(args);
//     while(1)
//     {
//         cout << "new thread" << ", thread name: " << td->threadname << ", createtime: " << td->createtime << endl;
//         td->func();

//         // if(td->threadname == "thread_4")
//         // {
//         //     cout << td->threadname << " 触发异常" << endl;
//         //     int *p = nullptr;
//         //     *p = 10;
//         // }

//         sleep(1);
//     }
    
// }

string ToHex(pthread_t tid)
{
    char id[64];
    snprintf(id, sizeof(id), "0x%lx", tid);

    return id;
}

// void *ThreadRoutine(void *args)
// {
//     string threadname = static_cast<const char*>(args);

//     int cnt = 5;
//     while(cnt--)
//     {
//         cout << "new thread -> name: " << threadname << endl;
//         sleep(1);
//     }

//     cout << "other thread done" << endl;
//     ThreadReturn *ret = new ThreadReturn(pthread_self(), "thread qiut normal", 10);

//     return ret;
//     // return nullptr;
//     // pthread_exit(nullptr);
//     // return (void *)"thread_1 done";
// }

// int main()
// {
//     pthread_t tid;

//     pthread_create(&tid, nullptr, ThreadRoutine, (void *)"thread_1");

//     cout << "tid: " << ToHex(tid) << endl;
    
//     // while(1)
//     // {
//     //     cout << "I am a main thread" << endl;
//     //     sleep(1);
//     // }

//     // sleep(10);
//     void *ret = nullptr;	

//     int n = pthread_join(tid, &ret); // 注意这里要&ret	
//     cout << "main thread done" << " n: " << n << endl;

//     ThreadReturn *r = static_cast<ThreadReturn *>(ret);
//     cout << "main thread get new thread info: " << r->code_ << ", " << ToHex(r->id_) << ", " << r->info_ << endl;

//     delete r;
//     // sleep(5);

//     return 0;

// }

// int main()
// {
//     vector<pthread_t> pthreads;
//     for(size_t  i = 0; i < threadnum; i++)
//     {
//         char threadname[64];
//         snprintf(threadname, sizeof(threadname), "%s_%lu", "thread", i+1);

//         pthread_t tid;
//         ThreadData *td = new ThreadData(threadname, (uint64_t)time(nullptr), Print);
//         pthread_create(&tid, nullptr, ThreadRoutine, td);
//         pthreads.push_back(tid);
//         sleep(1);
//     }

//     for(auto &tid : pthreads)
//     {
//         cout << tid << endl;
//     }
//     // pthread_t tid;

//     // ThreadData *td = new ThreadData("thread_1", (uint64_t)time(nullptr), Print);

//     // pthread_create(&tid, nullptr, ThreadRountine, td);
    
//     while(1)
//     {
//         cout << "I am a main thread" << endl;
//         sleep(1);
//     }
//     return 0;
// }

// 线程分离
void *ThreadRoutine(void *args)
{
    string threadname = static_cast<const char*>(args);

    int cnt = 5;
    while(cnt--)
    {
        cout << "new thread -> name: " << threadname << endl;
        sleep(1);
    }

    cout << "other thread cancel done" << endl;
    
    return nullptr;
}

// int main()
// {
//     pthread_t tid;

//     pthread_create(&tid, nullptr, ThreadRoutine, (void *)"thread_1");

//     sleep(5);
//     pthread_detach(tid);
//     int n = pthread_cancel(tid);
//     cout << "main thread done" << ", n: " << n << endl;

//     void *ret = nullptr;

//     n = pthread_join(tid, &ret);
//     cout << "main thread join done" << " n: " << n << ", thread return: " << (int64_t)ret << endl;
    
//     return 0;
// }

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, ThreadRoutine, (void *)"thread_1");

    cout << "pthread_t id: " << pthread_self() << endl;

    return 0;
}